/*
? 和22的区别在于add需要返回一个promise
? https://github.com/Sunny-117/js-challenges/issues/149
 */

class Scheduler {
    constructor(max) {
        this.max = max
        this.queue = []
        this.count = 0
    }
    add(fn) {
        return new Promise((resolve, reject) => {
            //? 添加队列 必须要把属于此次任务的resolve/reject保存下来
            this.queue.push({fn,resolve,reject})
            //? 调用run函数
            this.run()
        })
    }
    run() {
        //? 并发限制判断
        if (this.max <= this.count || this.queue.length === 0) return
        //? 没达到并发限制 执行fn函数
        this.count++
        const {fn,resolve,reject} = this.queue.shift()
        //? 等待fn函数完成后减少并发 并再调下一个任务
        fn().then(() => {
            //? 调用这个Promise的resolve,开始执行then,即打印数字了
            resolve()
            this.count --
            this.run()
        })
    }
}
// 延迟函数
const sleep = time => new Promise(resolve => setTimeout(resolve, time));

// 同时进行的任务最多2个
const scheduler = new Scheduler(2);

// 添加异步任务
// time: 任务执行的时间
// val: 参数
const addTask = (time, val) => {
    scheduler.add(() => {
        return sleep(time)
    }).then(() => console.log(val));
};

addTask(1000, '1');
addTask(500, '2');
addTask(300, '3');
addTask(400, '4');
